import psutil
import re
import configparser
import os
from datetime import datetime, timezone
import time
import ntplib
from typing import Callable, List
from utils.paths import DATA_DIR
from collections import Counter


def find_process_id_by_name(process_name):
    """
    根据进程名称查找对应的进程 ID

    :param process_name: 进程名称（如 'notepad.exe'）
    :return: 包含匹配进程 ID 的列表
    """
    matching_pids = []
    # 遍历所有正在运行的进程
    for proc in psutil.process_iter(['pid', 'name']):
        try:
            # 检查进程名称是否匹配
            if proc.info['name'].lower() == process_name.lower():
                matching_pids.append(proc.info['pid'])
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            # 忽略无权限访问或已终止的进程
            continue
    if len(matching_pids) > 0:
        return matching_pids
    else:
        return None


class WechatNotFoundError(Exception):
    """自定义异常：未找到微信客户端"""
    pass


# 处理微信消息列表中的时间 17:02
def remove_time(text):
    # 支持匹配 0:05, 9:30, 13:45, 23:59 等格式
    pattern = r'\b(?:[01]?[0-9]|2[0-3]):[0-5][0-9]\b'
    result = re.sub(pattern, '', text)
    return result


def get_network_time():
    """
    获取网络时间，获取不到网络时间时获取本地时间
    :return:
    """
    try:
        client = ntplib.NTPClient()
        response = client.request('pool.ntp.org', version=3)  # 使用 NTP 版本 3, 秒偏移
        utc_time = datetime.fromtimestamp(response.tx_time, timezone.utc)  # UTC 时间
        local_time = utc_time.astimezone()  # 自动转本地时区
        return local_time
    except:
        return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())



class ConfigReader:
    def __init__(self, config_file):
        self.config = configparser.ConfigParser()

        if not os.path.exists(config_file):
            raise FileNotFoundError(f"配置文件未找到: {config_file}")

        # 读取配置文件，推荐指定编码（如 UTF-8）
        self.config.read(config_file, encoding='utf-8')

    def get_value(self, section, key, fallback=None):
        """
        根据 section 和 key 获取配置值

        :param section: 配置节名，如 'database'
        :param key: 键名，如 'host'
        :param fallback: 如果键不存在时的默认值
        :return: 键对应的字符串值，或 fallback
        """
        return self.config.get(section, key, fallback=fallback)

    def get_int(self, section, key, fallback=None):
        """获取整数类型值"""
        return self.config.getint(section, key, fallback=fallback)

    def get_float(self, section, key, fallback=None):
        """获取浮点数类型值"""
        return self.config.getfloat(section, key, fallback=fallback)

    def get_bool(self, section, key, fallback=None):
        """
        获取布尔类型值（自动识别 yes/no, true/false, on/off, 1/0）
        """
        return self.config.getboolean(section, key, fallback=fallback)


def auto_wechat_msg(msg):
    """
    消息处理

    :param msg: 接收到的消息内容
    :return: None
    """
    try:
        # 初始化配置读取器
        cfg = ConfigReader(DATA_DIR / "config.ini")

        # 获取字符串值
        valueText = cfg.get_value("关键字回复", msg)
        return valueText
    except Exception as e:
        print(f"配置读取错误: {e}")

